package optional; /**
 * Meituan.com Inc.
 * Copyright (c) 2010-2018 All Rights Reserved.
 */

import org.junit.Test;

import java.util.Arrays;
import java.util.Optional;

/**
 * <p>选填类，他解决了空指针异常问题</p>
 *
 * @author tuyou@meituan.com
 * @version v0.1 2018-05-30 下午7:01 tuyou Exp $$
 */
public class OptionalTest {

    @Test
    public void create() {
//        Optional<String> o = Optional.of(null); //如果为空，为报空指针错误
        Optional<String> o = Optional.ofNullable(null);
    }

    /**
     * 如果为空返回orElse的参数，否则返回里面包装的值
     */
    @Test
    public void orElse() {
        Optional<String> o = Optional.ofNullable(null);
        System.out.println(o.orElse("默认值"));
    }

    /**
     * 如果有值，执行一个函数
     */
    @Test
    public void ifPresent(){
        Optional.ofNullable("sdfd").ifPresent(System.out::println);
    }

    /**
     * 如果有值，执行map转换
     */
    @Test
    public void map(){
        System.out.println(Optional.ofNullable("12").map(String::length).orElse(-1));
        String str = null;
        System.out.println(Optional.ofNullable(str).map(String::length).orElse(-1));
    }

    /**
     * 把两层Optional转为一层
     */
    @Test
    public void flatMap() {
        Optional.of("123").flatMap(item -> Optional.of(Integer.parseInt(item))).ifPresent(System.out::println);
    }

    @Test
    public void filter() {
        Optional.of("123,456").filter(item -> item.contains("123")).ifPresent(System.out::println);
    }

    /**
     * 不推荐使用get方法，因为他在空对象时，同样报空指针
     */
    @Deprecated
    @Test
    public void get() {
        System.out.println(Optional.of("123").get());
    }
}